package com.example.user.controller;

import com.alibaba.fastjson.JSONObject;
import com.example.bean.User;
import com.example.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.Executor;

/**
 * @Author 刘武贵
 * @Date 2024/2/27 23:45
 * @Description 功能描述：用户控制器
 * 用户调用订单微服务的提交订单接口下单时，订单微服务会调用用户微服务的接口获取用户的基本信息。
 */
@Slf4j
@RestController
public class UserController {

    /**
     * 用户业务接口
     */
    @Resource
    private UserService userService;

    /**
     * 执行任务
     * @param task 任务对象
     */
    @Resource
    private Executor executor;

    /**
     * 根据用户ID获取用户信息
     * @param uid 用户ID
     * @return 用户信息
     */
    @GetMapping(value = "/get/{uid}")
    public User getUser(@PathVariable("uid") Long uid){
        // 调用服务层方法获取用户信息
        User user = userService.getUserById(uid);
        // 打印获取到的用户信息
        log.info("获取到的用户信息为：{}", JSONObject.toJSONString(user));
        // 返回用户信息
        return user;
    }

    /**
     * http://localhost:10001/server-user/user/api1/demo1
     * 获取api1Demo1接口的返回值 测试网关整合Sentinel限流-实现自定义API分组维度限流
     * @return 返回值为字符串"api1Demo1"
     */
    @GetMapping(value = "/api1/demo1")
    public String api1Demo1(){
        log.info("访问了api1Demo1接口");
        return "api1Demo1";
    }

    /**
     * http://localhost:10001/server-user/user/api1/demo2
     * 获取api1Demo2接口的返回值 测试网关整合Sentinel限流-实现自定义API分组维度限流
     * @return 返回值为字符串"api1Demo2"
     */
    @GetMapping(value = "/api1/demo2")
    public String api1Demo2(){
        log.info("访问了api1Demo2接口");
        return "api1Demo2";
    }

    /**
     * http://localhost:10001/server-user/user/api2/demo1
     * API2的demo1接口 测试网关整合Sentinel限流-实现自定义API分组维度限流
     */
    @GetMapping(value = "/api2/demo1")
    public String api2Demo1(){
        log.info("访问了api2Demo1接口");
        return "api2Demo1";
    }

    /**
     * 访问地址：http://localhost:10001/server-user/user/api2/demo2
     * 获取api2/demo2接口的返回值 测试网关整合Sentinel限流-实现自定义API分组维度限流
     * @return 返回字符串"api2Demo2"
     */
    @GetMapping(value = "/api2/demo2")
    public String api2Demo2(){
        log.info("访问了api2Demo2接口");
        return "api2Demo2";
    }

    /**
     * API接口filter1 演示Spring cloud GateWay 内部过滤器
     * 访问地址：http://localhost:10001/server-user/user/api/filter1
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @return 返回字符串"apiFilter1"
     */
    @GetMapping(value = "/api/filter1")
    public String apiFilter1(HttpServletRequest request, HttpServletResponse response){
        log.info("访问了apiFilter1接口");
        String ip = request.getHeader("IP");
        String name = request.getParameter("name");
        log.info("ip = " + ip + ", name = " + name);
        return "apiFilter1";
    }

    /**
     * 获取sleuth filter的api 演示自定义链路过滤器
     * 访问链接：http://localhost:10001/server-user/user/sleuth/filter/api
     * @param request 请求对象
     * @return 返回sleuthFilter
     */
    @GetMapping(value = "/sleuth/filter/api")
    public String sleuthFilter(HttpServletRequest request) {
        // 获取traceId对象
        Object traceIdObj = request.getAttribute("traceId");
        // 将traceId对象转换为字符串
        String traceId = traceIdObj == null ? "" : traceIdObj.toString();
        // 打印获取到的traceId
        log.info("获取到的traceId为: " + traceId);
        // 返回sleuthFilter
        return "sleuthFilter";
    }

    /**
     * 处理异步API请求的方法。演示使用@Async注解开启任务
     *
     * 该方法首先记录开始执行异步任务的日志信息，然后调用userService中的异步方法，
     * 之后记录异步任务执行结束的日志信息，最后返回一个字符串"asyncApi"。
     *
     * @return 返回一个表示异步API处理的字符串。
     */
    @GetMapping(value = "/async/api")
    public String asyncApi() {
        log.info("执行异步任务开始...");
        // 异步执行方法
        userService.asyncMethod();
        log.info("异步任务执行结束...");
        return "asyncApi";
    }


}
